package com.example.demo.control;

import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

/**
 * Etag是 Entity tag的缩写，可以理解为“被请求变量的实体值”，
 * Etag是服务端的一个资源的标识，在 HTTP 响应头中将其传送到客户端。
 * 所谓的服务端资源可以是一个Web页面，也可以是JSON或XML等。
 * 服务器单独负责判断记号是什么及其含义，并在HTTP响应头中将其传送到客户端。
 * 比如，浏览器第一次请求一个资源的时候，服务端给予返回，并且返回了ETag: "50b1c1d4f775c61:df3"
 * 这样的字样给浏览器，当浏览器再次请求这个资源的时候，浏览器会将If-None-Match: W/"50b1c1d4f775c61:df3"
 * 传输给服务端，服务端拿到该ETAG，对比资源是否发生变化，如果资源未发生改变，则返回304HTTP状态码，不返回具体的资源。
 *
 */
@RestController
@RequestMapping("/cache")
public class CacheController {

    @RequestMapping("/etag")
    public ResponseEntity<String> last(@RequestHeader(value="IF-Modified-Since",required = false) Date ifModifiedSince) {

        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss 'GMT'", Locale.US);

        long now = System.currentTimeMillis() / 1000 *1000;

        HttpHeaders headers = new HttpHeaders();

        String body = "<a href =''>hi点我</a>";

        String ETag = getMd5(body);

        headers.add("Date", simpleDateFormat.format(new Date(now)));
        headers.add("ETag", ETag);

        return new ResponseEntity<>(body,headers, HttpStatus.OK);
    }


    private MyFile file = MyFile.getInstance();
    @RequestMapping("/CacheControl")
    public ResponseEntity<String> CacheControl(@RequestHeader(value="IF-Modified-Since",required = false) Date ifModifiedSince) {

        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss 'GMT'", Locale.US);

        long now = System.currentTimeMillis() / 1000 *1000;
        // 系统当前时间

        System.out.println(now);
        // 缓存时间
        long maxAge = 20;

        HttpHeaders headers = new HttpHeaders();

        if (null != ifModifiedSince && ifModifiedSince.getTime() == file.getLastModified() ) {

            System.out.println(304);

        }

        headers.add("Date", simpleDateFormat.format(new Date(now)));
        headers.add("Expires", simpleDateFormat.format(new Date(now + maxAge * 1000)));
        headers.add("Cache-Control", "max-age="+maxAge);
        headers.add("Last-Modified", simpleDateFormat.format(new Date(file.getLastModified())));

        String body = "<a href =''>hi点我</a>";
        return new ResponseEntity<>(body,headers,HttpStatus.OK);
    }

    /**
     * 字符串转md5
     * @param msg
     * @return
     */
    private String getMd5(String msg) {
        MessageDigest md5 = null;

        try {
            md5 = MessageDigest.getInstance("MD5");
        } catch (NoSuchAlgorithmException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        md5.update(msg.getBytes());
        byte[] digest = md5.digest();

        StringBuffer buf = null;
        buf = new StringBuffer(digest.length * 2);
        //遍历
        for (int i = 0; i < digest.length; i++) {
            if (((int) digest[i] & 0xff) < 0x10) { //(int) b[i] & 0xff 转换成无符号整型
                buf.append("0");
            }
            //Long.toHexString( 无符号长整数的十六进制字符串表示
            buf.append(Long.toHexString((int) digest[i] & 0xff));
        }
        return buf.toString();
    }




}
